// 在函数定义中使用泛型
// @author 风杨
// @date 22-9-8 上午11:34
// @see <a href="yueny09@163.com">mailTo: yueny09@163.com</a>
//

pub fn funcWithSyn(){
    println!("funcWithSyn.");

    // 寻找 number_list 中最大值
    let number_list = vec![34, 50, 25, 100, 65];
    // let result = largest_i32(&number_list);
    let result = largest(&number_list);
    println!("The largest number is {}", result);

    // 寻找 char_list 中最大值
    let char_list = vec!['y', 'm', 'a', 'q'];
    // let result = largest_char(&char_list);
    let result = largest(&char_list);
    println!("The largest char is {}", result);
}


/* 寻找 list 中最大值 */
// fn read_slice(slice: &[usize]) { ... }
fn largest_i32(list: &[i32]) -> i32{
    let mut max = list[0];

    for &item in list {
        if item > max {
            max = item;
        }
    }

    max
}

/* 寻找 list 中最大值 */
fn largest_char(list: &[char]) -> char {
    let mut max = list[0];

    for &item in list {
        if item > max {
            max = item;
        }
    }

    max
}

/*
上述方法函数体的代码是一样的，我们可以定义一个函数，再引进泛型参数来消除这种重复。
通过泛型实现的 寻找 list 中最大值
*/
fn largest<T: std::cmp::PartialOrd>(list: &[T]) -> &T {
    let mut max = &list[0];

    for item in list {
        if item > max {
            max = item;
        }
    }

    max
}